iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
佛心分享-刷題不只是刷題

只是單純想刷題XD系列 第 8

只是單純想刷題XD Day8

  • 分享至 

  • xImage
  •  

今天就來寫第八題~

題目

https://ithelp.ithome.com.tw/upload/images/20240920/20160320ZMGPoMPm1l.jpg

題目翻譯

實作函式 myAtoi(string s),其將一字串轉為一個 32 位元有號整數(類似於 C/C++ 之函式 atoi())

解題思路

1.去除前導空格:
使用一個迴圈遍歷字串,跳過所有的空白字符,直到找到第一個非空字符的位置 i。

2.判斷符號:
檢查 str[i] 是否為 + 或 - 符號。如果是,則根據符號設定 sign 變數(正數為 1,負數為 -1),然後移動到下一個字符。

3.解析數字:
使用另一個迴圈逐個字符檢查,將每個數字字符轉換為對應的整數並累加到 num 中。這裡通過 num = num * 10 + (str[i] - '0') 來實現數字的累加。
在這個過程中,若有非數字字符出現則停止。

4.溢出檢查:
在每次更新 num 之後,檢查當前值是否超過 32 位整數的範圍。若 num * sign 超過 INT_MAX,則返回 INT_MAX;若小於 INT_MIN,則返回 INT_MIN

5.返回結果:
最後返回 num * sign,即將數字與符號相乘得到最終結果。

code

/**
 * @param {string} str
 * @return {number}
 */
var myAtoi = function(str) {
    const INT_MAX = 2147483647;
    const INT_MIN = -2147483648;
    
    let i = 0;
    // 1. 去除前導空格
    while (i < str.length && str[i] === ' ') {
        i++;
    }
    
    // 2. 判斷符號
    let sign = 1; // 預設為正數
    if (i < str.length && (str[i] === '+' || str[i] === '-')) {
        sign = str[i] === '+' ? 1 : -1;
        i++;
    }

    // 3. 解析數字
    let num = 0;
    while (i < str.length && isDigit(str[i])) {
        num = num * 10 + (str[i] - '0');
        i++;
        
        // 4. 溢出檢查
        if (num * sign > INT_MAX) return INT_MAX;
        if (num * sign < INT_MIN) return INT_MIN;
    }

    return num * sign;
};

// 助手函數:判斷字符是否為數字
function isDigit(char) {
    return char >= '0' && char <= '9';
}


上一篇
只是單純想刷題XD Day7
下一篇
只是單純想刷題XD Day9
系列文
只是單純想刷題XD30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言